package com.hbzhit.modules.act.handle;

import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;

import java.util.List;
import java.util.Map;

/**
 * 任务查询接口
 *
 * @author DING
 * @date 2019年7月23日
 */
public interface WorkFlowTaskQuery {

    /**
     * 创建流程任务查询对象
     *
     * @return 流程任务查询对象
     */
    public TaskQuery createTaskQuery();

    /**
     * 获取流程变量
     *
     * @param taskId       任务id
     * @param variableName 变量名称
     * @return 变量值
     */
    public String findVariableByTaskId(String taskId, String variableName);

    /**
     * 获取业务id
     *
     * @param taskId 任务id
     * @return 业务id
     */
    public String findBusinessKeyByTaskId(String taskId);

    /**
     * 创建流程任务历史记录查询对象
     *
     * @return 流程任务历史记录查询对象
     */
    public HistoricTaskInstanceQuery createHistoricTaskInstanceQuery();

    /**
     * 获取任务对象
     *
     * @param taskId 任务id
     * @return 任务对象
     */
    public Task taskId(String taskId);

    /**
     * 获取任务对象
     *
     * @param processInstanceId 流程实例id
     * @return 任务对象
     */
    public Task processInstanceId(String processInstanceId);

    /**
     * 获取候选用户任务列表
     *
     * @param userId 用户id
     * @param start  当前页
     * @param limit  页大小
     * @return 任务列表
     */
    public List<Task> taskCandidateUser(String userId, int start, int limit);

    /**
     * 获取执行用户任务列表
     *
     * @param userId 用户id
     * @param start  当前页
     * @param limit  页大小
     * @return 任务列表
     */
    public List<Task> taskAssignee(String userId, int start, int limit);

    /**
     * 获取候选用户或执行用户任务列表
     *
     * @param userId 用户id
     * @param start  当前页
     * @param limit  页大小
     * @return 任务列表
     */
    public List<Task> taskCandidateOrAssigned(String userId, int start, int limit);

    /**
     * 获取候选用户任务列表
     *
     * @param userId    用户id
     * @param variables 参数
     * @param start     当前页
     * @param limit     页大小
     * @return 任务列表
     */
    public List<Task> taskCandidateUserByCondition(String userId, Map<String, Object> variables, int start, int limit);

    /**
     * 获取执行用户任务列表
     *
     * @param userId    用户id
     * @param variables 参数
     * @param start     当前页
     * @param limit     页大小
     * @return 任务列表
     */
    public List<Task> taskAssigneeByCondition(String userId, Map<String, Object> variables, int start, int limit);

    /**
     * 获取候选用户或执行用户任务列表
     *
     * @param userId    用户id
     * @param variables 参数
     * @param start     当前页
     * @param limit     页大小
     * @return 任务列表
     */
    public List<Task> taskCandidateOrAssignedByCondition(String userId, Map<String, Object> variables, int start, int limit);

    /**
     * 获取执行用户任务列表
     *
     * @param assignee 用户id
     * @param query    任务查询对象
     * @param start    当前页
     * @param limit    页大小
     * @return 任务列表
     */
    public List<Task> taskAssigneeByTaskQuery(String assignee, TaskQuery query, int start, int limit);

    /**
     * 获取候选用户任务数量
     *
     * @param userId 用户id
     * @return 任务数量
     */
    public long countTaskCandidateUser(String userId);

    /**
     * 获取执行用户任务数量
     *
     * @param userId 用户id
     * @return 任务数量
     */
    public long countTaskAssignee(String userId);

    /**
     * 获取候选用户或执行用户任务数量
     *
     * @param userId 用户id
     * @return 任务数量
     */
    public long countTaskCandidateOrAssigned(String userId);

    /**
     * 获取候选用户任务数量
     *
     * @param userId    用户id
     * @param variables 参数
     * @return 任务数量
     */
    public long countTaskCandidateUserByCondition(String userId, Map<String, Object> variables);

    /**
     * 获取执行用户任务数量
     *
     * @param userId    用户id
     * @param variables 参数
     * @return 任务数量
     */
    public long countTaskAssigneeByCondition(String userId, Map<String, Object> variables);

    /**
     * 获取候选用户或执行用户任务数量
     *
     * @param userId    用户id
     * @param variables 参数
     * @return 任务数量
     */
    public long countTaskCandidateOrAssignedByCondition(String userId, Map<String, Object> variables);

    /**
     * 获取执行用户任务数量
     *
     * @param assignee 用户id
     * @param query    任务查询对象
     * @return 任务数量
     */
    public long countTaskAssigneeByTaskQuery(String assignee, TaskQuery query);

    /**
     * 获取执行用户历史任务列表
     *
     * @param userId 用户id
     * @return 历史任务列表
     */
    public List<HistoricTaskInstance> taskAssigneeHistory(String userId, int start, int limit);

    /**
     * 获取备注
     *
     * @param taskId 任务id
     * @return 备注列表
     */
    public List<Comment> getTaskComments(String taskId);

}

